/**
 * \file SGrille.h
 * \author Catalin BLAJ
 * \author Vincent JACQUEMIN
 * \date 19 Octobre 2013
 *
 * Fichier header SGrille.h pour le programme du Sudoku.
 */


#ifndef SGRILLE_H
#define SGRILLE_H

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <assert.h>

#include "SUnite.h"

#define TAILLE_SAUVEGARDE_MAX 4000

/*----------------
|   STRUCTURE    |
----------------*/

/**
 * \struct SGrille
 * \brief Structure d'une grille de Sudoku.
 *
 * Ceci est la structure d'une grille de Sudoku.
 */
typedef struct SGrille
{
    /** Entier représentant le type de Sudoku. */
    unsigned char type;
    /** Tableau de n^4 cases. */
    SCase** cases;
    /** Tableau de n² lignes. */
    SUnite** lignes;
    /** Tableau de n² colonnes. */
    SUnite** colonnes;
    /** Tableau de n² régions. */
    SUnite** regions;
} SGrille;



/*-------------------
|     FONCTIONS     |
-------------------*/

/* INITIALISATION - TESTAMENT */

/**
 * \brief Initialiseur de SGrille.
 * \param type : Type de Sudoku (donnée).
 * \return Renvoie un pointeur vers la grille initialisée.
 *
 * Initialiseur de SGrille.
 */
SGrille* SG_initialiser(unsigned char type);

/**
 * \brief Initialiseur de SGrille par copie.
 * \param grille : Grille que l'on veut copier (donnée).
 * \return Renvoie un pointeur vers la nouvelle grille initialisée.
 *
 * Cette fonction permet de copier une grille.
 */
SGrille* SG_initialiserCopie(const SGrille* grille);

/**
 * \brief Initialiseur de SGrille.
 * \param sauvegarde : Chaine formatée (donnée).
 * \return Renvoie un pointeur vers la grille initialisée.
 *
 * Initialiseur de SGrille par chargement (chaine formatée).
 */
SGrille* SG_initialiserChargement(const char* sauvegarde);

/**
 * \brief Testament de SGrille.
 * \param grille : Grille que l'on veut détruire (donnée-résultat).
 *
 * Testament de SGrille.
 */
void SG_testament(SGrille* grille);


/* ACCESSEURS */

/**
 * \brief Accesseur du type de Sudoku.
 * \param grille : Grille de Sudoku dont on veut connaitre le type (donnée).
 * \return Renvoie le type de Sudoku.
 *
 * Cette fonction permet d'accéder au type de Sudoku.
 */
unsigned char SG_getType(const SGrille* grille);

/**
 * \brief Accesseur de case dans la grille.
 * \param grille : Grille où se trouve la case que l'on cherche (donnée).
 * \param indice : Indice de la case que l'on cherche (donnée).
 *
 * Cette fonction permet de renvoyer le pointeur d'une case se trouvant dans la grille.
 */
SCase* SG_getCase(const SGrille* grille, unsigned indice);

/**
 * \brief Accesseur de ligne dans la grille.
 * \param grille : Grille où se trouve la ligne que l'on cherche (donnée).
 * \param indice : Indice de la ligne que l'on cherche (donnée).
 *
 * Cette fonction permet de renvoyer le pointeur d'une ligne se trouvant dans la grille.
 */
SUnite* SG_getLigne(const SGrille* grille, unsigned short indiceLigne);

/**
 * \brief Accesseur de colonne dans la grille.
 * \param grille : Grille où se trouve la colonne que l'on cherche (donnée).
 * \param indice : Indice de la colonne que l'on cherche (donnée).
 *
 * Cette fonction permet de renvoyer le pointeur d'une colonne se trouvant dans la grille.
 */
SUnite* SG_getColonne(const SGrille* grille, unsigned short indiceColonne);

/**
 * \brief Accesseur de région dans la grille.
 * \param grille : Grille où se trouve la région que l'on cherche (donnée).
 * \param indice : Indice de la région que l'on cherche (donnée).
 *
 * Cette fonction permet de renvoyer le pointeur d'une région se trouvant dans la grille.
 */
SUnite* SG_getRegion(const SGrille* grille, unsigned short indiceRegion);

/**
 * \brief Mutateur de cases dans la grille.
 * \param grille : Grille dans laquelle on veut mettre la case.
 * \param indice : Indice de la case.
 * \param nouvelleCase : Nouvelle case que l'on veut mettre.
 *
 * Cette fonction modifie une case dans une grille.
 */
void SG_setCase(SGrille* grille, unsigned short indice, SCase* nouvelleCase);

/**
 * \brief Mutateur de lignes dans la grille.
 * \param grille : Grille dans laquelle on veut mettre la case (donnée-résultat).
 * \param indice : Indice de la case (donnée).
 * \param nouvelleLigne : Nouvelle ligne que l'on veut mettre (donnée-résultat).
 *
 * Cette fonction modifie une ligne dans une grille.
 */
void SG_setLigne(SGrille* grille, unsigned short indiceLigne, SUnite* nouvelleLigne);

/**
 * \brief Mutateur de colonnes dans la grille.
 * \param grille : Grille dans laquelle on veut mettre la case (donnée-résultat).
 * \param indice : Indice de la case (donnée).
 * \param nouvelleColonne : Colonne que l'on veut mettre (donnée-résultat).
 *
 * Cette fonction modifie une colonne dans une grille.
 */
void SG_setColonne(SGrille* grille, unsigned short indiceLigne, SUnite* nouvelleColonne);

/**
 * \brief Remplisseur de grille avec tableau 4x4.
 * \param grille : Grille que l'on veut remplir (donnée-résultat).
 * \param grilleTab : Tableau de départ (donnée).
 *
 *  Cette fonction permet de remplir une grille 4x4 avec un tableau de valeurs.
 */
void SG_remplirGrilleAvecTableau4x4(SGrille* grille, int grilleTab[4][4]);

/**
 * \brief Remplisseur de grille avec tableau 9x9.
 * \param grille : La grille que l'on veut remplir (donnée-résultat).
 * \param grilleTab : Le tableau de départ (donnée).
 *
 *  Cette fonction permet de remplir une grille 9x9 avec un tableau de valeurs.
 */
void SG_remplirGrilleAvecTableau9x9(SGrille* grille, int grilleTab[9][9]);

/**
 * \brief Remplisseur de grille avec tableau 16x16.
 * \param grille : La grille que l'on veut remplir (donnée-résultat).
 * \param grilleTab : Le tableau de départ (donnée).
 *
 *  Cette fonction permet de remplir une grille 16x16 avec un tableau de valeurs.
 *
 */
void SG_remplirGrilleAvecTableau16x16(SGrille* grille, int grilleTab[16][16]);


/* SAUVEGARDE */

/**
 * \brief Fonction permettant de créer une chaine pour sauvegarder une grille.
 * \param grille : La grille à sauvegarder.
 * \return Renvoie la chaine créée.
 *
 * Cette fonction permet de sauvegarder une grille.
 */
char* SG_toChaine(const SGrille* grille);

#endif
